/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2007，所有权利保留。
 * 
 * 项目名：	rumba
 * 文件名：	BPersistentReader.java
 * 模块说明：	
 * 修改历史：
 * Nov 28, 2007 - lxm - 创建。
 */
package com.hd123.rumba.gwt.base.server.biz;

import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.gwt.base.client.biz.BPersistent;
import com.hd123.rumba.gwt.base.client.exception.ClientBizException;
import com.hd123.rumba.runtime.IPersistent;
import com.hd123.rumba.util.ObjectUtil;

/**
 * 持久化对象 | 业务层 | 阅读器
 * <p>
 * 
 * 设计作为所有业务层实体阅读器类的父类。该与业务层实体对象配合使用，为实体对象提供从对应持久层对象读取数据的功能。
 * <p>
 * 
 * 该类与com.hd123.rumba.gwt.base.client.biz.BPersistent对应。
 * 
 * @see com.hd123.rumba.gwt.base.client.biz.BPersistent
 * @author lxm
 * 
 */
public abstract class BPersistentReader {

  /** 当前作为赋值目标的业务层对象。 */
  private BPersistent target;

  /**
   * 从指定的持久层对象读取数据到通过{@link #setTarget()}所指定的作为目标的业务层对象。
   * 
   * @param source
   *          指定的持久层对象，作为赋值的源。不可为null。
   * @throws BusinessException
   */
  public void read(IPersistent source) throws BusinessException {
    ObjectUtil.checkParameterNotNull(source, "source");
    if (target == null)
      throw new BusinessException("属性target不可为null。");
    try {
      target.setUuid(source.getUuid());
    } catch (ClientBizException e) {
      throw new BusinessException(e);
    }
  }

  /**
   * 支持空值复制的从持久层对象赋值。
   * 
   * @param <T>
   * @param source
   *          来源的持久层对象，允许空。
   * @param targetClass
   *          目标对象的类类型。需要通过其创建目标对象。
   * @return 目标对象，可能为null。
   * @throws ClientBizException
   */
  protected <T extends BPersistent> T readObject(IPersistent source, Class<T> targetClass)
      throws BusinessException {
    if (source == null)
      return null;
    T target = null;
    try {
      target = (T) targetClass.newInstance();
      BPersistentReader reader = (BPersistentReader) Class.forName(target.getReaderClassName())
          .newInstance();
      reader.setTarget(target);
      reader.read(source);
      return target;
    } catch (ClientBizException e) {
      throw new BusinessException(e);
    } catch (InstantiationException e) {
      throw new BusinessException(e);
    } catch (IllegalAccessException e) {
      throw new BusinessException(e);
    } catch (ClassNotFoundException e) {
      throw new BusinessException(e);
    }
  }

  /** 当前作为赋值目标的业务层对象。 */
  public BPersistent getTarget() {
    return target;
  }

  /** 当前作为赋值目标的业务层对象。 */
  public void setTarget(BPersistent target) {
    this.target = target;
  }
}
